// strngbad.h -- flawed string class definition
#include <iostream>

#ifndef STRNGBAD_H_
#define STRNGBAD_H_
/**
 * c++ primer plus 第 p348页的demo
 */
class StringBad {
private:
    char *str;                // pointer to string
    int len;                   // length of string
    static int num_strings;    // number of objects
public:
    StringBad(const char *s); // constructor
    StringBad();               // default constructor
    ~StringBad();              // destructor
// friend function
    friend std::ostream &operator<<(std::ostream &os,
                                    const StringBad &st);

//    自定义一个复制构造函数，试图解决问题
    StringBad(const StringBad &old);

//    重载赋值运算符
    StringBad &operator=(const StringBad &sb);

//    重载 >> 运算符，搭配 istream 使用
//      因为调用者是 istream ，所以必须使用友元函数
    friend std::istream &operator>>(std::istream &in, StringBad &sb);

/**    从 StringBad 中取出第i个 字符
 *     但是此方法不能取出 常量 const StringBad 中的内容
 *     因为无法确保取出的 char 不被修改
 */
    char &operator[](const int i);
/**
 * 重载时，c++将区分 常量和非常量函数的特征标
 * 所以，这里提供一个只供 const StringBad 使用的 operator[] 版本
 * */
    const char &operator[](const int i) const;


//    返回字符串的长度
    int size() const;

    static int HowMany();

//    比较谁先谁后
    int operator>(const StringBad & second)const;

    int operator<(const StringBad & second)const;
};

#endif
